package com.ruoyi.framework.manager.factory

import com.ruoyi.common.constant.Constants
import com.ruoyi.common.utils.LogUtils.getBlock
import com.ruoyi.common.utils.ServletUtils.request
import com.ruoyi.common.utils.ip.AddressUtils
import com.ruoyi.common.utils.ip.IpUtils
import com.ruoyi.common.utils.spring.SpringUtils
import com.ruoyi.system.domain.SysLogininfor
import com.ruoyi.system.domain.SysOperLog
import com.ruoyi.system.service.ISysLogininforService
import com.ruoyi.system.service.ISysOperLogService
import eu.bitwalker.useragentutils.UserAgent
import org.slf4j.LoggerFactory
import java.util.*

/**
 * 异步工厂（产生任务用）
 *
 * @author ruoyi
 */
object AsyncFactory {
    private val sys_user_logger = LoggerFactory.getLogger("sys-user")

    /**
     * 记录登录信息
     *
     * @param username 用户名
     * @param status 状态
     * @param message 消息
     * @param args 列表
     * @return 任务task
     */
    @JvmStatic
    fun recordLogininfor(username: String?, status: String, message: String?,
                         vararg args: Any?): TimerTask {
        val userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"))
        val ip = IpUtils.ipAddr
        return object : TimerTask() {
            override fun run() {
                val address = AddressUtils.getRealAddressByIP(ip)
                val s = StringBuilder()
                s.append(getBlock(ip))
                s.append(address)
                s.append(getBlock(username))
                s.append(getBlock(status))
                s.append(getBlock(message))
                // 打印信息到日志
                sys_user_logger.info(s.toString(), *args)
                // 获取客户端操作系统
                val os = userAgent.operatingSystem.getName()
                // 获取客户端浏览器
                val browser = userAgent.browser.getName()
                // 封装对象
                val logininfor = SysLogininfor()
                logininfor.userName = username
                logininfor.ipaddr = ip
                logininfor.loginLocation = address
                logininfor.browser = browser
                logininfor.os = os
                logininfor.msg = message
                // 日志状态
                if (org.apache.commons.lang3.StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
                    logininfor.status = Constants.SUCCESS
                } else if (Constants.LOGIN_FAIL == status) {
                    logininfor.status = Constants.FAIL
                }
                // 插入数据
                SpringUtils.getBean(ISysLogininforService::class.java).insertLogininfor(logininfor)
            }
        }
    }

    /**
     * 操作日志记录
     *
     * @param operLog 操作日志信息
     * @return 任务task
     */
    fun recordOper(operLog: SysOperLog): TimerTask {
        return object : TimerTask() {
            override fun run() {
                // 远程查询操作地点
                operLog.operLocation = operLog.operIp?.let { AddressUtils.getRealAddressByIP(it) }
                SpringUtils.getBean(ISysOperLogService::class.java).insertOperlog(operLog)
            }
        }
    }
}
